1 module dlangui_bearlibterminal.events;
2 
3 import BearLibTerminal: BT = terminal;
4 import dlangui;
5 
6 KeyEvent convertKeyEvent(BT.keycode event, bool keyReleased)
7 {
8     if(!(event >= 0x04 && event <= 0x72)) // This is not keyboard event?
9         return null;
10 
11     /// DlangUI keycode
12     uint dk;
13 
14     with(BT)
15     switch(event)
16     {
17         case keycode.left: dk = KeyCode.LEFT; break;
18         case keycode.right: dk = KeyCode.RIGHT; break;
19         case keycode.down: dk = KeyCode.DOWN; break;
20         case keycode.up: dk = KeyCode.UP; break;
21         case keycode.enter: dk = KeyCode.RETURN; break;
22         case keycode.tab: dk = KeyCode.TAB; break;
23         case keycode.space: dk = KeyCode.SPACE; break;
24         case keycode.escape: dk = KeyCode.ESCAPE; break;
25         case keycode.backspace: dk = KeyCode.BACK; break;
26         case keycode.minus: dk = KeyCode.KEY_SUBTRACT; break;
27         case keycode.equals: dk = KeyCode.EQUAL; break;
28         case keycode.lbracket: dk = KeyCode.KEY_BRACKETOPEN; break;
29         case keycode.rbracket: dk = KeyCode.KEY_BRACKETCLOSE; break;
30         case keycode.backslash: dk = KeyCode.BACKSLASH; break;
31         case keycode.semicolon: dk = KeyCode.SEMICOLON; break;
32         case keycode.apostrophe: dk = KeyCode.QUOTE; break;
33         case keycode.grave: dk = KeyCode.TILDE; break;
34         case keycode.comma: dk = KeyCode.KEY_COMMA; break;
35         case keycode.period: dk = KeyCode.KEY_PERIOD; break;
36         case keycode.slash: dk = KeyCode.SLASH; break;
37         case keycode.pause: dk = KeyCode.PAUSE; break;
38         case keycode.insert: dk = KeyCode.INS; break;
39         case keycode.home: dk = KeyCode.HOME; break;
40         case keycode.end: dk = KeyCode.END; break;
41         case keycode.pageup: dk = KeyCode.PAGEUP; break;
42         case keycode.pagedown: dk = KeyCode.PAGEDOWN; break;
43         case keycode.KP_divide: dk = KeyCode.DIV; break;
44         case keycode.KP_multiply: dk = KeyCode.MUL; break;
45         case keycode.KP_plus: dk = KeyCode.ADD; break;
46         case keycode.KP_minus: dk = KeyCode.SUB; break;
47         case keycode.KP_period: dk = KeyCode.DECIMAL; break;
48         case keycode.KP_enter: dk = KeyCode.RETURN; break;
49         case keycode.K_delete: dk = KeyCode.DEL; break;
50         case keycode.K_0: dk = KeyCode.KEY_0; break;
51         case keycode.KP_0: dk = KeyCode.NUM_0; break;
52 
53         default:
54             int keytable_diff;
55 
56             if(event >= keycode.a && event <= keycode.z) // letters
57                 keytable_diff = KeyCode.KEY_A - keycode.a;
58             else if(event >= keycode.K_1 && event <= keycode.K_9) // numbers
59                 keytable_diff = KeyCode.KEY_1 - keycode.K_1;
60             else if(event >= keycode.KP_1 && event <= keycode.KP_9) // numpad numbers
61                 keytable_diff = KeyCode.NUM_1 - keycode.KP_1;
62             else if(event >= keycode.F1 && event <= keycode.F12) // Fxx keys
63                 keytable_diff = KeyCode.F1 - keycode.F1;
64             else
65                 return null;
66 
67             dk = event + keytable_diff;
68 
69             break;
70     }
71 
72     KeyAction buttonDetails = keyReleased ? KeyAction.KeyUp : KeyAction.KeyDown;
73 
74     uint flags;
75 
76     with(BT)
77     with(BT.keycode)
78     {
79         if(check(shift)) flags |= KeyFlag.Shift;
80         if(check(ctrl)) flags |= KeyFlag.Control;
81         if(check(alt)) flags |= KeyFlag.Alt;
82     }
83 
84     /// "Dlangui Key Event"
85     KeyEvent dke = new KeyEvent(buttonDetails, dk, flags, null);
86 
87     Log.v("Key event "~event.to!string~" converted to "~dke.toString);
88 
89     return dke;
90 }
91 
92 MouseEvent convertMouseEvent(BT.keycode _event, bool keyReleased)
93 {
94     if(!(_event >= 0x80 && _event <= 0x8C)) // This is not mouse event?
95         return null;
96 
97     MouseButton btn;
98     MouseAction btnDetails = keyReleased ? MouseAction.ButtonUp : MouseAction.ButtonDown;
99     short wheelDelta = 0;
100 
101     with(BT.keycode)
102     switch(_event)
103     {
104         case mouse_left: btn = MouseButton.Left; break;
105         case mouse_right: btn = MouseButton.Right; break;
106         case mouse_middle: btn = MouseButton.Middle; break;
107         case mouse_x1: btn = MouseButton.XButton1; break;
108         case mouse_x2: btn = MouseButton.XButton2; break;
109 
110         case mouse_scroll:
111             btnDetails = MouseAction.Wheel;
112             wheelDelta = BT.state(mouse_wheel).to!short;
113             break;
114 
115         case mouse_move:
116             btnDetails = MouseAction.Move;
117             break;
118 
119         default:
120             Log.w("Mouse event isn't supported: "~_event.to!string);
121             return null;
122     }
123 
124     ushort flags;
125 
126     with(BT)
127     with(BT.keycode)
128     {
129         if(check(shift)) flags |= MouseFlag.Shift;
130         if(check(ctrl)) flags |= MouseFlag.Control;
131         if(check(alt)) flags |= MouseFlag.Alt;
132     }
133 
134     short x_coord = BT.state(BT.keycode.mouse_x).to!short;
135     short y_coord = BT.state(BT.keycode.mouse_y).to!short;
136 
137     /// "Dlangui Mouse Event"
138     MouseEvent dme = new MouseEvent(btnDetails, btn, flags, x_coord, y_coord, wheelDelta);
139 
140     Log.v("Mouse event "~_event.to!string~" converted to "~dme.to!string, " wheelDelta="~dme.wheelDelta.to!string);
141 
142     return dme;
143 }